#include <iostream>
#include <typeinfo>

using namespace std;

class base {
public:
 base() {
  print();
 }
 base(void*) {
  print_2();
 }
 virtual void print() {
  cout << typeid(this).name() << endl;
 }
 virtual void print_2() = 0;
};

class child_1: public base {
public:
 child_1() { 
  print();
 }
 child_1(void*) {
 }
 child_1(void* data, void*) : base(data) {
 }
 virtual void print() {
  cout << typeid(this).name() << endl;
 }
 virtual void print_2() {
  cout << typeid(this).name() << endl;
 }
};

int main() {
  cout << "step 1" << endl;
  child_1 var1;
  cout << "step 2" << endl;
  child_1 var2(0);
  cout << "step 3" << endl;
//  child_1 var3(0, 0); // error!
  return 0;
}

